// cat.js

// 导入 child_process 模块中的 exec 函数
const { exec } = require("child_process");

// 获取当前用户的主目录
const userProfile = process.env.USERPROFILE;

// 定义空猫图标和满猫图标的路径
const emptyIconPath = `${userProfile}\\Downloads\\cat_icons\\cat_4.dll,0`;
const fullIconPath = `${userProfile}\\Downloads\\cat_icons\\cat_1.dll,0`;

// 定义设置空猫图标和满猫图标的注册表命令
const setEmptyIconCommand = `reg add "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\{645FF040-5081-101B-9F08-00AA002F954E}\\DefaultIcon" /v empty /t REG_SZ /d "${emptyIconPath}" /f`;
const setFullIconCommand = `reg add "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\{645FF040-5081-101B-9F08-00AA002F954E}\\DefaultIcon" /v full /t REG_SZ /d "${fullIconPath}" /f`;

// 封装执行命令的函数并返回 Promise
function executeCommand(command) {
  return new Promise((resolve, reject) => {
    exec(command, (error, stdout, stderr) => {
      if (error) {
        console.error(`执行错误: ${error}`);
        reject();
        return;
      }
      if (stderr) {
        console.error(`标准错误输出: ${stderr}`);
      }
      console.log(`标准输出: ${stdout}`);
      resolve();
    });
  });
}

// 异步函数：设置猫图标
async function setCatIcon() {
  await executeCommand(setEmptyIconCommand);
  await executeCommand(setFullIconCommand);

  // 等待 3 秒钟，然后刷新资源管理器
  await new Promise((resolve) => setTimeout(resolve, 3000));
  refreshExplorer();
}

// 封装执行命令的函数并返回 Promise
function execPromise(command) {
  return new Promise((resolve, reject) => {
    exec(command, (error, stdout, stderr) => {
      if (error) {
        reject(`执行错误: ${error}`);
        return;
      }
      if (stderr) {
        reject(`执行错误: ${stderr}`);
        return;
      }
      resolve(stdout);
    });
  });
}

// 异步函数：重启资源管理器
async function refreshExplorer() {
  try {
    // 结束资源管理器进程
    await execPromise("taskkill /f /im explorer.exe");
    console.log("资源管理器已结束.");

    // 重启资源管理器，但不等待其执行完成
    exec("start explorer.exe", (error, stdout, stderr) => {
      if (error) {
        console.error(`重启资源管理器时出错: ${error}`);
      }
    });

    console.log("资源管理器重启命令已发出.");
  } catch (error) {
    console.error(error);
  } finally {
    // 确保无论成功还是失败，进程都将退出
    console.log("退出进程.");

    setTimeout(() => {
      process.exit(0);
    }, 1000 * 3);
  }
}

// 定义还原默认图标的路径
const emptyIconPathRest = `%SystemRoot%\\System32\\imageres.dll,-55`;
const fullIconPathRest = `%SystemRoot%\\System32\\imageres.dll,-54`;

// 定义设置空猫图标和满猫图标为默认图标的注册表命令
const setEmptyIconCommandRest = `reg add "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\{645FF040-5081-101B-9F08-00AA002F954E}\\DefaultIcon" /v empty /t REG_SZ /d "${emptyIconPathRest}" /f`;
const setFullIconCommandRest = `reg add "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\{645FF040-5081-101B-9F08-00AA002F954E}\\DefaultIcon" /v full /t REG_SZ /d "${fullIconPathRest}" /f`;

// 异步函数：还原默认图标
async function reset() {
  await executeCommand(setEmptyIconCommandRest);
  await executeCommand(setFullIconCommandRest);

  // 等待 3 秒钟，然后刷新资源管理器
  await new Promise((resolve) => setTimeout(resolve, 3000));
  refreshExplorer();
}

// 处理命令行参数
const args = process.argv.slice(2);
if (args.length > 0 && args[0] === "reset") {
  // node cat.js reset
  reset();
} else {
  // node cat.js
  setCatIcon();
}

